
package nsga;

/**
 *
 * @author Gustavo Planás
 */

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.math.BigInteger;

public class Prueba
{
    private static int[] nodos;
    private static IndividuoSCICTD individuo;
    private static int cant;
    
    // Cambiar para otras pruebas.
    private static String archivo = "e:\\Datos60.txt";
    private static String archivoSal = "e:\\Resultados60";
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) throws Exception
    {
        // Se leen las mediciones del archivo.
        BufferedReader bufferedReader = new BufferedReader(new FileReader(archivo));
        // La primera línea del archivo es el último número generado.
        BigInteger big = new BigInteger(bufferedReader.readLine());
        //BigInteger big = new BigInteger("1");
        int narch = Integer.parseInt(bufferedReader.readLine());
        int limite = Integer.parseInt(bufferedReader.readLine());
        // La segunda línea del archivo es la cantidad de medidores.
        int n = Integer.parseInt(bufferedReader.readLine());
        cant = n;
        // La tercera línea del archivo es la cantidad de muestras.
        int T = Integer.parseInt(bufferedReader.readLine());
        double[][] mediciones = new double[T][n];
        for (int i = 0; i < T; i++) 
        {
            // Las siguientes líneas son las mediciones.
            String[] fila = bufferedReader.readLine().split(";");
            for (int j = 0; j < cant; j++)
                mediciones[i][j] = Double.parseDouble(fila[j]);
        }
        
        SCICTD problema = new SCICTD(mediciones);
        
        // Se generan todos los posibles individuos.
        nodos = new int[cant];
        individuo = new IndividuoSCICTD(cant);
        System.out.println("Vectores =>");
        String bin;
        int nodo;
        int len;
        double[] fitness;
        BigInteger uno = new BigInteger("1");
        BigInteger fin = new BigInteger("2");
        fin = fin.pow(cant);
        //for(int i = 1; i < Math.pow(2.0,cant); i++)
        //{
        BufferedWriter bufferedWriter = null;
        boolean nuevo = true;
        int lineas = 0;
        while(big.compareTo(fin) < 0)
        {
            bin = big.toString(2);
            len = bin.length();
            // Inicializar.
            for(int j = 0; j < cant; j++)
                nodos[j] = 0;
            // Completar con ceros.
            for(int j = len; j < cant; j++)
                bin = "0" + bin;
            // Meter en el vector de nodos.
            for(int j = 0; j < cant; j++)
            {
                nodo = Integer.parseInt(bin.substring(j,j+1));
                nodos[j] = nodo;
            }
            
            // Se imprime el individuo y su fitness.
            //System.out.print(i + ". ");
            //imprimirNodos();
            individuo.setNodos(nodos);
            problema.setFitness(individuo);
            fitness = individuo.getFitness();
            //System.out.println("Fitness = " + fitness[0] + "; " + fitness[1] + "; " + fitness[2] + "; " + fitness[3] + "; " + fitness[4] + "; " + fitness[5]);
            //System.out.println("; " + fitness[0] + "; " + fitness[1] + "; " + fitness[2] + "; " + fitness[3] + "; " + fitness[4] + "; " + fitness[5]);
            if (nuevo)
            {
                String archivoSalida = archivoSal + "-" + narch + ".txt";
                bufferedWriter = new BufferedWriter(new FileWriter(archivoSalida));
                narch++;
                nuevo = false;
                lineas = 0;
            }
            
            lineas++;
            bufferedWriter.write(big.toString() + "; " + bin + "; " + fitness[0] + "; " + fitness[1] + "; " + fitness[2] + "; " + fitness[3] + "; " + fitness[4] + "; " + fitness[5] + "\n");
            
            big = big.add(uno);
            
            if (lineas == limite)
            {
                System.out.println("Terminó el archivo " + narch);
                bufferedWriter.close();
                nuevo = true;
            }
        }
        bufferedWriter.close();
    }

    private static void imprimirNodos()
    {
        for(int i = 0; i < cant; i++)
        {
            System.out.print(nodos[i]);
        }
        System.out.println();
    }
}
